package com.theima.mytreeset.myhashset;

/**
 * @program: Myset
 * @description:
 * @author: xuejingjing
 * @create: 2021-06-08 21:45
 **/

//<>泛型 要和集合中的数据类型保持一致

/**
 * 1.定义一个空参构造方法
 * 2.实现Comparable<Student></>
 * 3.重写里面的compareTo方法
 */

/**
 * 总结：
 * 1,哈希值(哈希码值)：是JDK根据对象的地址或者属性值，算出来的int类型的整数。
 * 2,object类中有一个方法可以获取对象的哈希值
 * public int hashCode();根据对象的地址值计算出来的哈希值
 *
 * 3.对象的哈希值特点：
 * （1）如果没有重写hashCode方法，那么是根据对象的地址值计算出的哈希值。
 * 同一个对象多次调用hashCode()方法返回的哈希值是相同的
 * 不同对象的哈希值是不一样的。
 *
 * （2）如果重写了hashCode方法，一般都是通过对象的属性值计算出哈希值。
 * 如果不同的对象属性值是一样的，那么计算出来的哈希值也是一样的。
 *
 */
public class Student implements  Comparable<Student>{
    private String name;
    private int age;

    public Student() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        //按照对象的年龄进行排序
          int result = this.age - o.age;
          return result;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Student student = (Student) o;

        if (age != student.age) return false;
        return name != null ? name.equals(student.name) : student.name == null;

    }

    //我们可以对Object类中的hashCode方法进行重写
    //在重写之后，就一般是根据对象的属性值来计算哈希值的。
    //此时跟对象的地址值就没有任何关系了。
    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }
}


